home *** CD-ROM | disk | FTP | other *** search
/ Aminet 52 / Aminet 52 (2002)(GTI - Schatztruhe)[!][Dec 2002].iso / Aminet / util / moni / Scout-src.lha / source / objects / scout_signal.c < prev    next >
Encoding:
C/C++ Source or Header  |  2002-09-17  |  11.9 KB  |  290 lines

  1. /**
  2.  * Scout - The Amiga System Monitor
  3.  *
  4.  *------------------------------------------------------------------
  5.  *
  6.  * This program is free software; you can redistribute it and/or modify
  7.  * it under the terms of the GNU General Public License as published by
  8.  * the Free Software Foundation; either version 2 of the License, or
  9.  * any later version.
  10.  *
  11.  * This program is distributed in the hope that it will be useful,
  12.  * but WITHOUT ANY WARRANTY; without even the implied warranty of
  13.  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  14.  * GNU General Public License for more details.
  15.  *
  16.  * You should have received a copy of the GNU General Public License
  17.  * along with this program; if not, write to the Free Software
  18.  * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
  19.  *
  20.  * You must not use this source code to gain profit of any kind!
  21.  *
  22.  *------------------------------------------------------------------
  23.  *
  24.  * @author Andreas Gelhausen
  25.  * @author Richard Körber <rkoerber@gmx.de>
  26.  */
  27.  
  28. #include "system_headers.h"
  29.  
  30. struct MUIP_SignalWin_GetSignals { ULONG methodID; UBYTE *objname; ULONG *signals; };
  31.  
  32. struct MUIP_SigBitChanged { ULONG whichbit; ULONG state; };
  33.  
  34. struct MUIP_SigStrChanged { UBYTE str; };
  35.  
  36. static __asm __saveds ULONG hex_editfunc( register __a0 struct Hook *hook, register __a2 struct SGWork *sgw, register __a1 ULONG *msg )
  37. {
  38.     ULONG return_code;
  39.  
  40.     return_code = ~0L;
  41.  
  42.     if (*msg == SGH_KEY) {
  43.         ULONG tmplong;
  44.  
  45.         if (sgw->EditOp == EO_REPLACECHAR || sgw->EditOp == EO_INSERTCHAR) {
  46.             LONG i = 0;
  47.             UBYTE c;
  48.  
  49.             if (sgw->WorkBuffer[0] == '$') i = 1;
  50.             if (!strncmp("0x", sgw->WorkBuffer, 2)) i = 2;
  51.  
  52.             while (c = sgw->WorkBuffer[i]) {
  53.                 if (!(c >= '0' && c <= '9') &&
  54.                     !(c >= 'a' && c <= 'f') &&
  55.                     !(c >= 'A' && c <= 'F')) {
  56.                     sgw->Actions |= SGA_BEEP;
  57.                     sgw->Actions &= ~SGA_USE;
  58.                     break;
  59.                 }
  60.                 i++;
  61.             }
  62.         } else if (sgw->EditOp == EO_ENTER && !IsUHex(sgw->WorkBuffer, &tmplong)) {
  63.             sgw->Actions |= SGA_BEEP;
  64.             sgw->Actions &= ~SGA_END;
  65.         }
  66.     } else {
  67.         return_code = 0;
  68.     }
  69.  
  70.     return return_code;
  71. }
  72.  
  73. MakeHook(hex_edithook, hex_editfunc);
  74.  
  75. static ULONG __asm __saveds sigbitchanged_func( register __a0 struct Hook *hook,
  76.                                                 register __a2 Object *obj,
  77.                                                 register __a1 struct MUIP_SigBitChanged *msg )
  78. {
  79.     struct SignalWinData *swd = INST_DATA(OCLASS(obj), obj);
  80.     UBYTE *sigstr;
  81.     ULONG sigs;
  82.  
  83.     get(swd->swd_SignalString, MUIA_String_Contents, &sigstr);
  84.     IsUHex(sigstr, &sigs);
  85.     if (msg->state)
  86.         sigs |= (1 << msg->whichbit);
  87.     else
  88.         sigs &= ~(1 << msg->whichbit);
  89.     MySetStringContents(swd->swd_SignalString, "$%08lx", sigs);
  90.  
  91.     return 0;
  92. }
  93.  
  94. MakeHook(sigbitchanged_hook, sigbitchanged_func);
  95.  
  96. static ULONG __asm __saveds sigstrchanged_func( register __a0 struct Hook *hook,
  97.                                                 register __a2 Object *obj,
  98.                                                 register __a1 struct MUIP_SigStrChanged *msg )
  99. {
  100.     struct SignalWinData *swd = INST_DATA(OCLASS(obj), obj);
  101.     UBYTE *sigstr;
  102.     ULONG sigs, sig;
  103.  
  104.     get(swd->swd_SignalString, MUIA_String_Contents, &sigstr);
  105.     IsUHex(sigstr, &sigs);
  106.     for (sig = 0; sig < 32; sig++) nnset(swd->swd_SignalCheckmarks[sig], MUIA_Selected, (sigs & (1 << sig)));
  107.  
  108.     return 0;
  109. }
  110.  
  111. MakeHook(sigstrchanged_hook, sigstrchanged_func);
  112.  
  113.  
  114. static ULONG __saveds mNew( struct IClass *cl,
  115.                             Object *obj,
  116.                             struct opSet *msg )
  117. {
  118.     APTR sigtext1, sigtext2, sigtext3, sigchecks[32], okButton, cancelButton;
  119.  
  120.     if (obj = (Object *)DoSuperNew(cl, obj,
  121.         MUIA_Window_ID, MakeID('S','E','N','D'),
  122.         WindowContents, VGroup,
  123.  
  124.             Child, MyVSpace(2),
  125.             Child, sigtext1 = MyTextObject(),
  126.             Child, MyVSpace(2),
  127.             Child, HGroup, MUIA_Group_SameWidth, TRUE,
  128.                 Child, HGroup,
  129.                     Child, KeyLabel(txtNewSignal, 's'),
  130.                     Child, sigtext2 = StringObject,
  131.                         MUIA_ControlChar, 's',
  132.                         MUIA_CycleChain, TRUE,
  133.                         MUIA_String_MaxLen, 10,
  134.                         MUIA_String_EditHook, &hex_edithook,
  135.                         MUIA_String_Format, MUIV_String_Format_Center,
  136.                         StringFrame,
  137.                     End,
  138.                     Child, MyLabel(txtWaitSignal),
  139.                     Child, sigtext3 = MyTextObject(),
  140.                 End,
  141.             End,
  142.  
  143.             Child, MyVSpace(2),
  144.             Child, ColGroup(23),
  145.                 Child, sigchecks[31] = MakeCheckmark(NULL), Child, LLabel("31"), Child, HSpace(0),
  146.                 Child, sigchecks[30] = MakeCheckmark(NULL), Child, LLabel("30"), Child, HSpace(0),
  147.                 Child, sigchecks[29] = MakeCheckmark(NULL), Child, LLabel("29"), Child, HSpace(0),
  148.                 Child, sigchecks[28] = MakeCheckmark(NULL), Child, LLabel("28"), Child, HSpace(0),
  149.                 Child, sigchecks[27] = MakeCheckmark(NULL), Child, LLabel("27"), Child, HSpace(0),
  150.                 Child, sigchecks[26] = MakeCheckmark(NULL), Child, LLabel("26"), Child, HSpace(0),
  151.                 Child, sigchecks[25] = MakeCheckmark(NULL), Child, LLabel("25"), Child, HSpace(0),
  152.                 Child, sigchecks[24] = MakeCheckmark(NULL), Child, LLabel("24"),
  153.                 Child, sigchecks[23] = MakeCheckmark(NULL), Child, LLabel("23"), Child, HSpace(0),
  154.                 Child, sigchecks[22] = MakeCheckmark(NULL), Child, LLabel("22"), Child, HSpace(0),
  155.                 Child, sigchecks[21] = MakeCheckmark(NULL), Child, LLabel("21"), Child, HSpace(0),
  156.                 Child, sigchecks[20] = MakeCheckmark(NULL), Child, LLabel("20"), Child, HSpace(0),
  157.                 Child, sigchecks[19] = MakeCheckmark(NULL), Child, LLabel("19"), Child, HSpace(0),
  158.                 Child, sigchecks[18] = MakeCheckmark(NULL), Child, LLabel("18"), Child, HSpace(0),
  159.                 Child, sigchecks[17] = MakeCheckmark(NULL), Child, LLabel("17"), Child, HSpace(0),
  160.                 Child, sigchecks[16] = MakeCheckmark(NULL), Child, LLabel("16"),
  161.                 Child, sigchecks[15] = MakeCheckmark(NULL), Child, LLabel("15"), Child, HSpace(0),
  162.                 Child, sigchecks[14] = MakeCheckmark(NULL), Child, LLabel("14"), Child, HSpace(0),
  163.                 Child, sigchecks[13] = MakeCheckmark(NULL), Child, LLabel("13"), Child, HSpace(0),
  164.                 Child, sigchecks[12] = MakeCheckmark(NULL), Child, LLabel("12"), Child, HSpace(0),
  165.                 Child, sigchecks[11] = MakeCheckmark(NULL), Child, LLabel("11"), Child, HSpace(0),
  166.                 Child, sigchecks[10] = MakeCheckmark(NULL), Child, LLabel("10"), Child, HSpace(0),
  167.                 Child, sigchecks[ 9] = MakeCheckmark(NULL), Child, LLabel(" 9"), Child, HSpace(0),
  168.                 Child, sigchecks[ 8] = MakeCheckmark(NULL), Child, LLabel(" 8"),
  169.                 Child, sigchecks[ 7] = MakeCheckmark(NULL), Child, LLabel(" 7"), Child, HSpace(0),
  170.                 Child, sigchecks[ 6] = MakeCheckmark(NULL), Child, LLabel(" 6"), Child, HSpace(0),
  171.                 Child, sigchecks[ 5] = MakeCheckmark(NULL), Child, LLabel(" 5"), Child, HSpace(0),
  172.                 Child, sigchecks[ 4] = MakeCheckmark(NULL), Child, LLabel(" 4"), Child, HSpace(0),
  173.                 Child, sigchecks[ 3] = MakeCheckmark(NULL), Child, LLabel(" 3"), Child, HSpace(0),
  174.                 Child, sigchecks[ 2] = MakeCheckmark(NULL), Child, LLabel(" 2"), Child, HSpace(0),
  175.                 Child, sigchecks[ 1] = MakeCheckmark(NULL), Child, LLabel(" 1"), Child, HSpace(0),
  176.                 Child, sigchecks[ 0] = MakeCheckmark(NULL), Child, LLabel(" 0"),
  177.             End,
  178.  
  179.             Child, MyVSpace(2),
  180.             Child, HGroup, MUIA_Group_SameWidth, TRUE,
  181.                 Child, okButton = MakeButton(txtMUIOk),
  182.                 Child, cancelButton = MakeButton(txtMUICancel),
  183.             End,
  184.         End,
  185.         TAG_MORE, msg->ops_AttrList))
  186.     {
  187.         struct SignalWinData *swd = INST_DATA(cl, obj);
  188.         APTR parent;
  189.         ULONG sig;
  190.  
  191.         swd->swd_SignalText[0] = sigtext1;
  192.         swd->swd_SignalText[1] = sigtext3;
  193.         swd->swd_SignalString = sigtext2;
  194.         CopyMem(sigchecks, swd->swd_SignalCheckmarks, sizeof(swd->swd_SignalCheckmarks));
  195.         swd->swd_OkButton = okButton;
  196.  
  197.         parent = (APTR)GetTagData(MUIA_Window_ParentWindow, (ULONG)NULL, msg->ops_AttrList);
  198.  
  199.         set(obj, MUIA_Window_Title, MyGetWindowTitle(txtSignalWinTitle, swd->swd_Title, sizeof(swd->swd_Title)));
  200.         set(obj, MUIA_Window_ActiveObject, sigtext2);
  201.  
  202.         DoMethod(parent,       MUIM_Window_AddChildWindow, obj);
  203.         DoMethod(obj,          MUIM_Notify, MUIA_Window_CloseRequest, TRUE,           MUIV_Notify_Application, 5, MUIM_Application_PushMethod, parent, 2, MUIM_Window_RemChildWindow, obj);
  204.         DoMethod(obj,          MUIM_Notify, MUIA_Window_CloseRequest, TRUE,           MUIV_Notify_Application, 2, MUIM_Application_ReturnID, 1);
  205.         DoMethod(sigtext2,     MUIM_Notify, MUIA_String_Contents,     MUIV_EveryTime, obj, 3, MUIM_CallHook, &sigstrchanged_hook, MUIV_TriggerValue);
  206.         DoMethod(okButton,     MUIM_Notify, MUIA_Pressed,             FALSE,          MUIV_Notify_Application, 2, MUIM_Application_ReturnID, 2);
  207.         DoMethod(cancelButton, MUIM_Notify, MUIA_Pressed,             FALSE,          MUIV_Notify_Application, 2, MUIM_Application_ReturnID, 1);
  208.         for (sig = 0; sig < 32; sig++) DoMethod(sigchecks[sig], MUIM_Notify, MUIA_Selected, MUIV_EveryTime, obj, 4, MUIM_CallHook, &sigbitchanged_hook, sig, MUIV_TriggerValue);
  209.     }
  210.  
  211.     return (ULONG)obj;
  212. }
  213.  
  214. static ULONG __saveds mDispose( struct IClass *cl,
  215.                                 Object *obj,
  216.                                 struct opSet *msg )
  217. {
  218.     set(obj, MUIA_Window_Open, FALSE);
  219.  
  220.     return (DoSuperMethodA(cl, obj, msg));
  221. }
  222.  
  223. static ULONG __saveds mGetSignals( struct IClass *cl,
  224.                                    Object *obj,
  225.                                    struct MUIP_SignalWin_GetSignals *msg )
  226. {
  227.     struct SignalWinData *swd = INST_DATA(cl, obj);
  228.     ULONG sig;
  229.     APTR app;
  230.     BOOL done = FALSE;
  231.     ULONG result = 0;
  232.  
  233.     MySetContents(swd->swd_SignalText[0], msgSelectNewSignal, msg->objname);
  234.     MySetContents(swd->swd_SignalText[1], MUIX_C "$%08lx", *msg->signals);
  235.     MySetStringContents(swd->swd_SignalString, "$%08lx", *msg->signals);
  236.  
  237.     for (sig = 0; sig < 32; sig++) nnset(swd->swd_SignalCheckmarks[sig], MUIA_Selected, (*msg->signals & (1 << sig)));
  238.  
  239.     get(obj, MUIA_ApplicationObject, &app);
  240.     set(app, MUIA_Application_Sleep, TRUE);
  241.     set(obj, MUIA_Window_Open, TRUE);
  242.  
  243.     while (!done) {
  244.         ULONG signals;
  245.  
  246.         switch (DoMethod(app, MUIM_Application_NewInput, &signals)) {
  247.             case MUIV_Application_ReturnID_Quit:
  248.             case 1:
  249.                 done = TRUE;
  250.                 result = 0;
  251.                 break;
  252.  
  253.             case 2:
  254.                 done = TRUE;
  255.                 result = 1;
  256.  
  257.             default:
  258.                 break;
  259.         }
  260.  
  261.         if (!done && signals != 0) Wait(signals);
  262.     }
  263.  
  264.     set(obj, MUIA_Window_Open, FALSE);
  265.     set(app, MUIA_Application_Sleep, FALSE);
  266.  
  267.     if (result) {
  268.         UBYTE *str;
  269.  
  270.         get(swd->swd_SignalString, MUIA_String_Contents, &str);
  271.         IsUHex(str, msg->signals);
  272.     }
  273.  
  274.     return result;
  275. }
  276.  
  277. ULONG __asm __saveds SignalWinDispatcher( register __a0 struct IClass *cl,
  278.                                           register __a2 Object *obj,
  279.                                           register __a1 Msg msg )
  280. {
  281.     switch (msg->MethodID) {
  282.         case OM_NEW:                    return (mNew(cl, obj, (APTR)msg));
  283.         case OM_DISPOSE:                return (mDispose(cl, obj, (APTR)msg));
  284.         case MUIM_SignalWin_GetSignals: return (mGetSignals(cl, obj, (APTR)msg));
  285.     }
  286.  
  287.     return (DoSuperMethodA(cl, obj, msg));
  288. }
  289.  
  290.